\section{Architettura dell'Applicazione} 

L'applicazione è stata sviluppata progettando un'architettura a quattro livelli, i quali racchiudono e separano le quattro principali tipologie di operazioni svolte durante l'esecuzione.

\begin{figure}[!h]
\centering
\includegraphics[width=2.52in]{Images/schemaGenerale}
\DeclareGraphicsExtensions.
\caption{Architettura generale}
\label{arc_gen}
\end{figure}

\subsection{Analisi dei layer}

\begin{itemize}

\item \textbf{connection layer:} si occupa di stabilire e gestire la connessione
con altri dispositivi vicini disponibili. È il livello fisico
dell'applicazione che gestisce tutti gli invii di dati e fornisce un astrazione sul mezzo trasmissivo utilizzato.
Una volta individuato un nuovo dispositivo equipaggiato con l'applicazione \emph{peer2tweet}, questo viene inviato al communication layer per cominciare la condivisione dei messaggi.

\item \textbf{communication layer:} È il livello logico dell'applicazione, nel quale
vengono implementati gli algoritmi di instadamento che stabiliscono i dispositivi da contattare, i messaggi da inviare e l'ordine da seguire. La coda di gestione è stata implementata ispirandosi all'algoritmo \emph{Leaky Bucket}, algoritmo nato per il controllo delle congestione di rete.
A questo livello è implementato il servizio che confronta i messaggi posseduti da due dispositivi, decidendo quali vanno condivisi.
Il servizio è avviato dal connection layer, ogniqualvolta risulti necessario contattare scambiare messaggi con un dispositivo.

\item \textbf{database layer:} fornisce un facile e rapido accesso alle funzioni del
database. Gestisce in modo automatico la creazione del database, l'inserimento
e estrazione dei dati dai messaggi. Il database utilizzato da Android è SQLite, versione 3.5.9.

\item \textbf{core layer:} rappresenta l'interfaccia utente. È il layer che si
occupa di ricevere le richieste degli utenti e di visualizzare i messaggi
conservati nel database. Per la realizzazione dell'interfaccia sono state utilizzate
le API di Android, ogni interfaccia è un Activity, ovvero un unità di esecuzione che
detiene il controllo dell'applicazione. In questo layer si possono gestire le impostazioni come il nome utente con cui firmare i propri messaggi e avviare ed arrestare il servizio che gestisce la ricerca di nuovi dispositivi e la condivisione dei messaggi.
Il menu principale dell'applicazione è visibile nella figura \ref{sc_gen}.

\end{itemize}

Tutti i layer sono stati progettati per essere il più indipendente possibile. Ad esempio il communication layer delega completamente al connection layer la gestione della connessione con altri dispositivi, indipendentemente dalla tecnologia utilizzata per effettuare tale trasmissione. In questo modo è molto semplice progettare ed aggiungere nuove funzioni, come ad esempio un nuovo canale di comunicazione che utilizzi il WiFi.
L'applicazione permette di creare il messaggio tramite il core layer che viene subito salvato
del database. Dopodiché il communication layer avvia un nuovo servizio sul dispositivo, così da permettere l'esecuzione della trasmissione anche quando l'applicazione non è in primo piano. Quando viene identificato un dispositivo inizia una contrattazione con lo scambio degli hash dei messaggi che hanno un valore di \emph{hop} maggiore o uguale a 1. Tale valore, stabilito alla creazione del messaggio, viene decrementato ad ogni trasmissione così da limitare la diffusione delle comunicazioni all'area geografica in cui un messaggio è stato scritto. La lista degli hash ricevuta viene confrontata con gli hash dei messaggi nel database e viene predisposto l'invio dei messaggi mancanti, che saranno successivamente consultabili nella sezione di visualizzazione
messaggi. Questo sistema permette di ottimizzare le trasmissioni, inviando solo dati realmente necessari, che non sono presenti nel database del ricevente.
L'algoritmo di invio e ricezione dei messaggi viene esposto nel dettaglio nel paragrafo riguardante il Bluetooth.

\begin{figure}[!h]
\centering
\includegraphics[width=2.52in]{Images/schermataPrincipale}
\DeclareGraphicsExtensions.
\caption{Schermata Principale}
\label{sc_gen}
\end{figure}

\subsection{La struttura del messaggio}
Ogni messaggio salvato ha la seguente struttura:

\begin{itemize}
\item \textbf{date} data in cui è stato creato il messaggio in formato iso 8601.

\item \textbf{author} Identificativo dell'autore del messaggio.

\item \textbf{message} Messaggio di testo di 140 caratteri, tipica dimensione di messaggi di microblogging.

\item \textbf{hop} Numero di salti (hop) che un messaggio può ancora fare.

\item \textbf{hash} Hash del nome autore e del testo del messaggio utilizzando l'algoritmo di message digest MD5.
\end{itemize}
Ogni messaggio è identificato dalla coppia chiave \emph{(author, messagge)}.
